using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Criterion;
using Didsoft.DataAccess.Hibernate;
using Didsoft.DataAccess.Contracts;
using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.AccesoDatos.Contratos;
using SIOGDE.AccesoDatos.Entidades.Reportes;

namespace SIOGDE.AccesoDatos.Contexto
{
   public class DestinoAsignadoAccesoDatos : DataAccessBasic<DestinoAsignado>, IDestinoAsignadoAccesoDatos
   {
     public DestinoAsignadoAccesoDatos()
     {
     }
     
     /// <summary>
     /// Devuelve una lista IList<DestinoAsignado> con todas las ocurrencias encontradas, en base a filtro.
     /// </summary>
     /// <param name="filtro"></param>
     /// <returns></returns>
     public IList<DestinoAsignado> BuscarPorFiltro(string filtro)
     {
             //ICriteria criteria = Session.CreateCriteria(typeof(DestinoAsignado));
             //criteria.Add(Expression.Like("Nombre", filtro+"%")); 
             //return criteria.List<DestinoAsignado>();
         var query = Session.CreateQuery(@"from DestinoAsignado da where da.Persona.ApellidoPaterno like :filtro OR
                                           da.Persona.ApellidoMaterno like :filtro OR
                                           da.Persona.Nombre1 like :filtro");
         query.SetAnsiString("filtro", filtro + "%");
         return query.List<DestinoAsignado>();
     }


     public IList<DestinoAsignado> BuscarPorFiltro(string filtro, int gestionId)
     {
         var query = Session.CreateQuery(@"from DestinoAsignado da 
                                           where (da.Persona.ApellidoPaterno like :filtro OR
                                           da.Persona.ApellidoMaterno like :filtro OR
                                           da.Persona.Nombre1 like :filtro) 
                                               and da.Gestion.Id = :gestionId");
         query.SetAnsiString("filtro", "%"+filtro + "%");
         query.SetInt32("gestionId", gestionId);
         return query.List<DestinoAsignado>();
     }


     public IList<DestinoAsignado> GetPorPersonaId(int PersonaIdSession)
     {
         var query = (from q in Session.QueryOver<DestinoAsignado>()
                      where q.Persona.Id == PersonaIdSession
                      select q);
         return query.List<DestinoAsignado>();
     }

     public DestinoAsignado GetPorPersonaId(int PersonaIdSession, int GestionId)
     {
         var query = (from q in Session.QueryOver<DestinoAsignado>()
                      where q.Persona.Id == PersonaIdSession && q.Gestion.Id == GestionId
                      select q);
         return query.SingleOrDefault<DestinoAsignado>();
     }



     public DestinoAsignado GetPorguid(string guidAsignacion)
     {
         var query = Session.CreateQuery(@"from DestinoAsignado da where da.Guid =  :guidAsignacion");
         query.SetAnsiString("guidAsignacion", guidAsignacion);
         return query.UniqueResult<DestinoAsignado>();
     }


     public IList<DestinoAsignado> GetPorGestion(int gestionId)
     {
         var query = (from q in Session.QueryOver<DestinoAsignado>()
                      where q.Gestion.Id == gestionId
                      select q);
         return query.List<DestinoAsignado>();
     }


     public int CountPorGestionActiva(int gestionId)
     {
         var sql = "select count(*) Result from DestinoAsignado where GestionId = :gestionId";
         var query = Session.CreateSQLQuery(sql);
         query.SetInt32("gestionId", gestionId);
         query.AddScalar("Result", NHibernateUtil.Int32);
         return query.UniqueResult<int>();
     }


       #region Reportes DTO


     public IList<DTODestinoAsignado> GetReportePorGestion(int gestionId)
     {
         string procedure = @"exec siodge_reporte_destinoAsignado :gestionId";

         var query = Session.CreateSQLQuery(procedure);
         query.SetInt32("gestionId", gestionId);
         return query.ListBeanTransformer<DTODestinoAsignado>();
     }

       #endregion



   }
}

